package indi.woniu.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: GaN601
 * @Date: 2021/12/15 20:01
 * @Description: 简单的工具类
 */
@Component
public class Util {
    private Util() {}
    
    
    private static final ObjectMapper JSON = new ObjectMapper();
    
    static {
        JSON.registerModule(new JavaTimeModule());
        JSON.setDateFormat(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
    }
    
    /**
     * Json 字符串转 JsonNode 对象
     *
     * @param json 要转换的字符串
     */
    public static JsonNode toJsonNode(String json) throws JsonProcessingException {
        return Util.JSON.readTree(json);
    }
    
    /**
     * 将对象转为 JSON 字符串
     *
     * @param obj 对象
     * @return json 字符串
     */
    public static <T> String toJsonStr(T obj) throws JsonProcessingException {
        return Util.JSON.writeValueAsString(obj);
    }
    
    /**
     * 将 JSON 字符串转换为 Map
     *
     * @param json json
     * @return Map
     */
    public static Map<String, Object> toMap(String json) throws JsonProcessingException {
        return JSON.readValue(json, Map.class);
    }
    
    /**
     * 将对象转为Map
     *
     * @param obj 对象
     * @param <T> 任意类型
     * @return Map
     */
    public static <T> Map<String, Object> toMap(T obj) {
        return JSON.convertValue(obj, Map.class);
    }
    
    /**
     * 将 JSON 字符串转为对象
     */
    public static <T> T toObject(String json, Class<T> clz) throws JsonProcessingException {
        return (T) Util.JSON.readValue(json, clz.getClass());
    }
    
    public static <T> T toObject(Map<String, Object> target, Class<T> clz) throws JsonProcessingException {
        return Util.JSON.readValue(Util.JSON.writeValueAsString(target), clz);
    }
    
    /**
     * 封装一个键值对为 Map
     */
    public static Map<String, Object> toMap(String key, Object value) {
        HashMap<String, Object> map = new HashMap<>(2);
        map.put(key, value);
        return map;
    }
    
}
